package com.lyy.encap;


import java.util.Scanner;

/**
 * @Author:  GZQ
 * @date:  2024/11/12 21:14

 * 封装：
 * 封装就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起，
 * 数据被保护在内部，程序的其他部分只有通过被授权的操作[方法], 才能对数据进行操作。

 * 封装的理解和好处
 * 1. 隐藏实现细节
 * 2. 可以对数据进行验证, 保证安全合理

 * 封装的实现步骤
 * 1. 将属性进行私有化private  [不能直接修改属性]
 * 2. 提供一个公共的set方法，用于对属性判断并赋值
 * 3. 提供一个公共的get方法, 用于获取属性的值
 */

public class Encapsulation {

    /**
     *  封装的快速入门
     *  需求：
     *  写一个程序：不能查看人的年龄、工资等隐私, 并对设置的年龄进行合理的验证。
     *  年龄合理就设置, 否则给默认年龄, 必须在 1-120, 年龄、 工资不能直接查看, name的长度在 2 - 6字符之间。
     */

    public static void main(String[] args) {
        Person person = new Person();
        person.setName("tom");
        person.setAge(30);
        person.setSalary(9999.99);
//        查看所有信息
        System.out.println(person.Info());
//        查看薪水
//        System.out.println(person.getSalary());

//        如果我们直接使用构造器指定属性
        Person jack = new Person("jack", 10000, 9999.99);
        System.out.println("=====jack的信息======");
        System.out.println(jack.Info());
    }
}


class Person {
    /**
     * 名字公开
     */
    public String name;
    /**
     * 私有化
     */
    private int age;
    /**
     * 私有化
     */
    private double salary;

    /**
     * 无参构造器
     */
    public Person() {
    }

    /**
     * 有三个属性的构造器
     */
    public Person(String name, int age, double salary) {
//        this.name = name;
//        this.age = age;
//        this.salary = salary;
        // 我们可以将set方法写在构造器中, 这样仍然可以验证 (构造器与setXxx结合的应用)
        setName(name);
        setAge(age);
        setSalary(salary);
    }

    /**
     * 自己写setXxx 和 getXxx 太慢, 可以使用快捷键
     */

    public String getName() {
        return name;
    }

    public void setName(String name) {
//        加入对数据的校验
        if(name.length() >= 2 && name.length() <= 6) {
            this.name = name;
        } else {
            System.out.println("你设置的名字不对, 需要在（ 2 - 6）字符之间, 默认名字");
            this.name = "xxx";
        }
    }

    public double getSalary() {
//        可以增加对当前对象的权限判断
//        添加密码权限, 密码输入正确,返回薪水, 错误返回-1
        System.out.println("请输入密码：");
        Scanner scanner = new Scanner(System.in);
        String password = scanner.next();
        if ("123456".equals(password)) {
            return salary;
        }
        return -1;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
//        判断
//        如果合理范围
        if(age >= 1 && age <= 120) {
            this.age = age;
        } else {
            System.out.println("你设置的年龄不对, 需要在（ 1 - 120）, 给你一个默认年龄 18");
//            给一个默认年龄
            this.age = 18;
        }
    }
    /**
     * 写一个方法， 返回属性信息
     */
    public String Info(){
        return "信息为 name=" + name + " age=" + age + " salary=" + salary;
    }
}

